﻿// valid_symbol.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <stack>
#include <map>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;

class Solution {
public:
    map<char, char>my_map = { {'(', ')'}, {'{', '}'}, {'[', ']'}};
    stack<char>my_stack;
    bool isValid(string s) {
        for (auto& s_char : s)
        {
            if (my_stack.empty()) {
                my_stack.emplace(my_map[s_char]);
                continue;
            }
            char curr_top = my_stack.top();
            if (s_char == curr_top)
            {
                my_stack.pop();
            }
            else {
                my_stack.emplace(my_map[s_char]);
            }
            
        }
        return my_stack.empty();
    }
};

class MinStack {
public:

    stack<int>min_stack;
    stack<int>my_stack;

    MinStack() {
        min_stack.push(INT_MAX);
    }

    void push(int val) {
        my_stack.push(val);
        min_stack.push(min(val, min_stack.top()));
    }

    void pop() {
        my_stack.pop();
        min_stack.pop();
    }

    int top() {
        return my_stack.top();
    }

    int getMin() {
        return min_stack.top();
    }
};


int main()
{
    {
        MinStack miniStack;
        miniStack.push(3);
        miniStack.push(2);
        miniStack.push(1);

        cout << miniStack.top() << endl;

        miniStack.pop();

        cout << miniStack.getMin() << endl;

        return 0;
    }

    Solution solution;
    /*for (auto& item : solution.my_map)
    {
        cout << item.first << ' ' << item.second << endl;
    }*/
    string str = "()[]{]";
    bool result = solution.isValid(str);
    cout << result;
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
